﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmInventarioProductoEnProcesoPorLinea.xaml
    /// </summary>
    public partial class FrmInventarioProductoEnProcesoPorLinea : Window
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtProductoEnProcesoPorLineaImprimir;//FJRF - Para la impresion de los datos
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        DataTable DtProductoEnProcesoPorLinea;//FJRF - Usamos este DataTable para hacer consultas 

        //String StrRutaReporteCrystalReport = @"C:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports

        String StrIncliuirGarantias = "N", StrIncliuirProduccion = "N", StrIncliuirDevoluciones = "N", StrIncliuirReparaciones = "N", StrIncliuirReconocidos = "N", StrIncliuirServicios = "N";//FJRF - Variables con valor por defecto para enviar al sp
        #endregion

        #region FJRF - EVENTOS DEL FORMULARIO
        public FrmInventarioProductoEnProcesoPorLinea()
        {
            InitializeComponent();
        }

        private void WinInventarioProductoEnProcesoPorLinea_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            string strTituloVentana = "INVENTARIO DE PRODUCTO EN PROCESO POR LINEA" + " - USUARIO:" + MDOgeneral.usuario + "- [FrmInventarioProductoEnProcesoPorLinea]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

        }
        private void ChkIncliuirGarantias_Click(object sender, RoutedEventArgs e)
        {
            if (ChkIncliuirGarantias.IsChecked == true)//FJRF - Si esta seleccionado hacemos lo siguiente
            {
                StrIncliuirGarantias = "S";//FJRF - Decimos que si incluye
            }
            else//FJRF - Sino esta seleccionado hacemos lo siguiente
            {
                StrIncliuirGarantias = "N";//FJRF - Decimos que no incluye
            }
        }
        private void ChkIncliuirProduccion_Click(object sender, RoutedEventArgs e)
        {
            if (ChkIncliuirProduccion.IsChecked == true)//FJRF - Si esta seleccionado hacemos lo siguiente
            {
                StrIncliuirProduccion = "S";//FJRF - Decimos que si incluye
            }
            else//FJRF - Sino esta seleccionado hacemos lo siguiente
            {
                StrIncliuirProduccion = "N";//FJRF - Decimos que no incluye
            }
        }
        private void ChkIncliuirDevoluciones_Click(object sender, RoutedEventArgs e)
        {
            if (ChkIncliuirDevoluciones.IsChecked == true)//FJRF - Si esta seleccionado hacemos lo siguiente
            {
                StrIncliuirDevoluciones = "S";//FJRF - Decimos que si incluye
            }
            else//FJRF - Sino esta seleccionado hacemos lo siguiente
            {
                StrIncliuirDevoluciones = "N";//FJRF - Decimos que no incluye
            }
        }
        private void ChkIncliuirReparaciones_Click(object sender, RoutedEventArgs e)
        {
            if (ChkIncliuirReparaciones.IsChecked == true)//FJRF - Si esta seleccionado hacemos lo siguiente
            {
                StrIncliuirReparaciones = "S";//FJRF - Decimos que si incluye
            }
            else//FJRF - Sino esta seleccionado hacemos lo siguiente
            {
                StrIncliuirReparaciones = "N";//FJRF - Decimos que no incluye
            }
        }
        private void ChkIncliuirReconocidos_Click(object sender, RoutedEventArgs e)
        {
            if (ChkIncliuirReconocidos.IsChecked == true)//FJRF - Si esta seleccionado hacemos lo siguiente
            {
                StrIncliuirReconocidos = "S";//FJRF - Decimos que si incluye
            }
            else//FJRF - Sino esta seleccionado hacemos lo siguiente
            {
                StrIncliuirReconocidos = "N";//FJRF - Decimos que no incluye
            }
        }
        private void ChkIncliuirServicios_Click(object sender, RoutedEventArgs e)
        {
            if (ChkIncliuirServicios.IsChecked == true)//FJRF - Si esta seleccionado hacemos lo siguiente
            {
                StrIncliuirServicios = "S";//FJRF - Decimos que si incluye
            }
            else//FJRF - Sino esta seleccionado hacemos lo siguiente
            {
                StrIncliuirServicios = "N";//FJRF - Decimos que no incluye
            }
        }
        private void DtgProductoEnProcesoPorLinea_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "UNIDADES" || strNombreColumna == "COSTO" || strNombreColumna == "TOTAL")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella

        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Procesar();//FJRF - Consultamos los datos
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            PttV_InventarioProductoEnProcesoPorLinea();//FJRF - Imprimimos los datos
        }
        private void BtnFiltrarOExportarAExcel_Click(object sender, RoutedEventArgs e)
        {
            PttV_FiltrarOExportarAExcel();//FJRF - Exportar los datos a excel
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Cierra el modulo actual
        }
        #endregion


        #region FJRF - FUNCIONES Y PROCEDIMIENTOS DEL FORMULARIO
        protected void PttV_Procesar()
        {
            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

            EjecutarSp_SP_INVPRCLINEA(StrIncliuirGarantias, StrIncliuirProduccion, StrIncliuirDevoluciones, StrIncliuirReparaciones, StrIncliuirReconocidos, StrIncliuirServicios);//FJRF - Ejecutamos el sp con estos parametros
            StrConsulta = "SELECT UPPER(NOMSEC_TMP) AS SECCION,  UPPER(NOMLIN_TMP) AS LINEA,  TOTPRO_TMP AS UNIDADES,  COSUNI_TMP AS COSTO,  COSTOT_TMP AS TOTAL ";//FJRF - Seleccionamos estos campos
            StrConsulta = StrConsulta + "FROM TMPINVPRCLINEA ";//FJRF - De esta tabla
            StrConsulta = StrConsulta + "ORDER BY CODSEC_TMP, CODLIN_TMP ";//FJRF - ordernando por estos criterios

            DtProductoEnProcesoPorLinea = MdoGeneral.consulta(StrConsulta);//FJRF - Ejecutamos la consulta
            DtgProductoEnProcesoPorLinea.ItemsSource = DtProductoEnProcesoPorLinea.DefaultView;//FJRF - cargamos el grid

            StrConsulta = "SELECT UPPER(CODSEC_TMP) AS CODSEC, UPPER(NOMSEC_TMP) AS SECCION,  UPPER(CODLIN_TMP) AS CODLIN, UPPER(NOMLIN_TMP) AS LINEA,  TOTPRO_TMP AS UNIDADES,  COSUNI_TMP AS COSTO,  COSTOT_TMP AS TOTAL ";//FJRF - Seleccionamos estos campos
            StrConsulta = StrConsulta + "FROM TMPINVPRCLINEA ";//FJRF - De esta tabla
            StrConsulta = StrConsulta + "ORDER BY CODSEC_TMP, CODLIN_TMP ";//FJRF - ordernando por estos criterios

            DtProductoEnProcesoPorLineaImprimir = new DataTable("DtDatosReporte");//FJRF - Creamos una nueva instancia (Este nombre debe ser igual al creado en el DataSet del cystal)
            DtProductoEnProcesoPorLineaImprimir = MdoGeneral.consulta(StrConsulta);//FJRF - Ejecutamos la consulta
            DtProductoEnProcesoPorLineaImprimir.TableName = "DtDatosReporte";//FJRF - Le damos un nombre a la tabla para poder verla en el DataSet (Este nombre debe ser igual al creado en el DataSet del cystal)

            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal - (En caso de que se quede asi por algun error inesperado)
        }
        private void EjecutarSp_SP_INVPRCLINEA(String Str_pva_incgar, String Str_pva_incprd, String Str_pva_incdev, String Str_pva_increp, String Str_pva_increc, String Str_pva_incser)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_INVPRCLINEA";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_incgar", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_pva_incgar;
                MDOgeneral.spComando.Parameters.Add("pva_incprd", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_pva_incprd;
                MDOgeneral.spComando.Parameters.Add("pva_incdev", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_pva_incdev;
                MDOgeneral.spComando.Parameters.Add("pva_increp", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_pva_increp;
                MDOgeneral.spComando.Parameters.Add("pva_increc", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_pva_increc;
                MDOgeneral.spComando.Parameters.Add("pva_incser", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_pva_incser;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }
        protected void PttV_FiltrarOExportarAExcel()
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                if (DtProductoEnProcesoPorLinea == null)//FJRF - Validamos que el reporte tenga datos para realizar el proceso de impresion
                {
                    Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                }
                else//FJRF - Si trae datos hacemos lo siguiente
                {
                    FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
                    FrmAyudas.pStrTituloVentana_Opcional = "INVENTARIO DE PRODUCTO EN PROCESO POR LINEA";//FJRF - Le enviamos un titulo personalizado al formulario

                    FrmAyudas.pDtDatosRecibidosConInformacion = DtProductoEnProcesoPorLinea.Copy();//FJRF - Enviamos los datos sacando una copia de los datos

                    //FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
                    FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "SECCION";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
                    FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "LINEA";//FJRF - Asignamos el dato a buscar
                    FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos
                    FrmAyudas.pBooPonerBotonExportarExcel_Opcional = true;//FJRF - Activamos el boton para que se le permita la exportacion de datos a excel

                    String StrColumnasParaFormato = "UNIDADES, COSTO, TOTAL";//FJRF - Columnas para formato numerico
                    FrmAyudas.pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional = StrColumnasParaFormato;//FJRF - Enviamos las columnas que se le van a hacer formato numerico

                    FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario

                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        protected void PttV_InventarioProductoEnProcesoPorLinea()
        {
            try//FJRF - Validamos el proceso de impresionrptResumenPorLinea.rpt
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptInventarioProductoEnProcesoPorLinea.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - ImprimimosElReporte
                    if (DtProductoEnProcesoPorLineaImprimir == null)//FJRF - Validamos que el reporte tenga datos para realizar el proceso de impresion
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                    }
                    else//FJRF - Si trae datos hacemos lo siguiente
                    {
                        CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                        DsImprimir = new DataSet("DsInventarioProductoEnProcesoPorLinea");//FJRF - DataSet que esta vinculado al CrystalReport

                        //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                        DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                        DsImprimir.Tables.Add(DtProductoEnProcesoPorLineaImprimir.Copy());//Detalle del Informe

                        produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                        vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    }
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrIncluirGarantias", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("StrIncluirProduccion", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("StrIncluirDevoluciones", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("StrIncluirReparaciones", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("StrIncluirReconocidos", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("StrIncluirServicios", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = "INVENTARIO DE PRODUCTO EN PROCESO POR LINEA";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrIncluirGarantias"] = StrIncliuirGarantias;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrIncluirProduccion"] = StrIncliuirProduccion;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrIncluirDevoluciones"] = StrIncliuirDevoluciones;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrIncluirReparaciones"] = StrIncliuirReparaciones;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrIncluirReconocidos"] = StrIncliuirReconocidos;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrIncluirServicios"] = StrIncliuirServicios;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }


        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #endregion

    }
}
